import pygame#导入模块
from pygame.locals import *#导入常量
import time
import random

class Enemybullet:#定义敌机子弹类
    def __init__(self,screen,x,y):
        self.x=x
        self.y=y
        self.screen=screen
        self.image=pygame.image.load('./pd.png')

    def display(self):
        self.screen.blit(self.image,(self.x,self.y))

    def move(self):
        self.y+=12#子弹速度要大于敌机速度
        if self.y>=520:#如果子弹越过屏幕返回True
            return True


class EnemyPlane:
    #定义敌机类
    def __init__(self,screen_temp):
        self.x=random.choice(range(408))
        self.y=-75
        self.screen=screen_temp
        self.image=pygame.image.load('./e'+str(random.choice(range(3)))+'.png')

    def display(self):
        #绘制敌机
        self.screen.blit(self.image,(self.x,self.y))

    def move(self,hero):
        self.y+=1
        if self.y>568:
            return True#如果敌机出屏幕返回True

        #遍历所以子弹,并执行碰撞检测
        for bo in hero.bullet_list:
            if bo.x>self.x+12 and bo.x<self.x+92 and bo.y>self.y+20 and bo.y<self.y+60:
                hero.bullet_list.remove(bo)#删除子弹
                return True

class Boom:
    def __init__(self,screen,x,y):
        self.x=x
        self.y=y
        self.n=0
        self.screen=screen
        self.image=None#表示一个空值，代表什么都没有

    def display(self):
        self.image=pygame.image.load('./bomb'+str(self.n)+'.png')
        self.screen.blit(self.image,(self.x,self.y))
        if self.n<=2:
            self.n+=1
        else:
            self.n=0

class HeroPlane:
    #定义玩家飞机类
    def __init__(self,screen_temp):
        self.x=200
        self.y=400
        self.screen=screen_temp
        self.image=pygame.image.load('./me.png')
        self.bullet_list=[]#由于存放玩家的子弹列表

    def display(self):
        # 绘制子弹
        for b in self.bullet_list:
            b.display()#显示子弹
            if b.move():#如果返回True，移除子弹
                self.bullet_list.remove(b)
        #绘制玩家飞机
        self.screen.blit(self.image,(self.x,self.y))


    def move_left(self):
        #左移动飞机
        self.x-=5
        if self.x<=0:
            self.x=0

    def move_right(self):
        self.x+=5
        if self.x>=406:
            self.x=406

    def fire(self):
        self.bullet_list.append(Bullet(self.screen,self.x,self.y))
class Bullet:
    #定义子弹类
    def __init__(self,screen_temp,x,y):
        self.x=x+53
        self.y=y
        self.screen=screen_temp
        self.image=pygame.image.load('./pd.png')

    def display(self):
        #绘制子弹
        self.screen.blit(self.image,(self.x,self.y))

    def move(self):
        self.y-=20
        if self.y<=-20:#如果子弹飞过屏幕上面就返回True
            return True

#键盘控制函数
def key_control(hero_temp):

    #获取按键信息
    pressed_keys=pygame.key.get_pressed()#以元组的形式返回按的按键，如果按下则对应的值为1
    #print(pressed_keys)
    #执行退出操作
    for event in pygame.event.get():
        if event.type==QUIT:
            print('exit()')
            exit()#退出程序
    #做判断，并执行对象的操作
    if pressed_keys[K_LEFT] or pressed_keys[K_a]:
        print('Left...')
        hero_temp.move_left()
    elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
        print('Right...')
        hero_temp.move_right()
    if pressed_keys[K_SPACE]:
        print('space...')
        hero_temp.fire()#发射子弹

def main():#定义运行主函数
    window=pygame.display.set_mode((512,568),0,0)#创建游戏窗口数据以元组的形式传入后面的两个0代表深度

    #创建一个游戏背景
    background=pygame.image.load('./bg2.png')
    #实例化玩家飞机
    hero = HeroPlane(window)
    m=-968
    enemylist=[]#存放敌机的列表
    enemy_bulletlist=[]#存放敌机子弹
    boomlist=[]#存放爆炸

    while True:
        #绘制画面
        window.blit(background,(0,m))#把背景放到创建好的窗口里
        m+=2
        if m>=-200:
            m=-968

        #键盘控制
        key_control(hero)

        # 绘制玩家飞机
        hero.display()

        #随机绘制敌机
        if random.choice(range(70))==10:
            enemylist.append(EnemyPlane(window))

        #遍历敌机并绘制移动
        for em in enemylist:
            em.display()
            em.move(hero)

            if random.randrange(10)==5:
                enemy_bulletlist.append(Enemybullet(window,em.x+51,em.y+57))

            em.move(hero)#移动敌机
            if em.move(hero):
                enemylist.remove(em)#删除敌机
                boomlist.append(Boom(window,em.x,em.y))

        for ea in enemy_bulletlist:
            ea.display()#显示敌机子弹
            ea.move()#移动敌机子弹
            if hero.x+12<ea.x+1<hero.x+94 and hero.y+12<ea.y+17<hero.y+33:#敌机子弹与飞机碰撞检测

                exit()#退出程序

        for b in boomlist:
            b.display()#显示爆炸效果
            if b.n>2:
                boomlist.remove(b)#防止爆炸效果重复出现

        # 更新显示
        pygame.display.update()

        # 定时显示
        time.sleep(0.04)

#判断当前程序是否是主程序，如果该程序被调用则不执行
if __name__=='__main__':
    main()